package ar.uade.distribuidas.tpo.web.delegado;

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;

import ar.uade.distribuidas.tpo.base.dominiodto.ClienteDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.CotizacionDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.EstadoItemPedido;
import ar.uade.distribuidas.tpo.base.dominiodto.FacturaDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ItemCotizacionDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ItemListaPrecioDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ItemPedidoDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ItemRemitoDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ItemSolicitudDeCotizacionDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ListaPrecioDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.OrdenDeCompraDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.OrdenDePedidoDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ProveedorDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.RemitoCPEDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.RemitoDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.RodamientoDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.SolicitudDeCotizacionDTO;
import ar.uade.distribuidas.tpo.base.remoto.IGestion;
import ar.uade.distribuidas.tpo.dba.dominio.OrdenDePedido;

public class BD {

	private IGestion gestion;
	private static BD bd;
	
	private BD(){
		LookupService();
	}
	public static BD getInstance(){
		if(bd == null)
			bd = new BD();
		return bd;
	}
	
    private void LookupService() {
    	try {
    		String vinculo = "Gestion";
			gestion = (IGestion)Naming.lookup (vinculo);
			System.out.println(vinculo);
		} catch (Exception e) {
			javax.swing.JOptionPane.showMessageDialog(null, e.getMessage());
		} 
    }

	// CLIENTE

	public void altaCliente(ClienteDTO cDTO) {
		try {
			gestion.altaCliente(cDTO);
		} catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();

		}
	}

	public void altaCliente(Long cuil, String nombre) {
		try {
			ClienteDTO cDTO = new ClienteDTO(cuil, nombre);
			gestion.altaCliente(cDTO);
		} catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();

		}
	}

	public void modificarCliente(ClienteDTO cDTO) {
		try {
			gestion.modificarCliente(cDTO);
		} catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();
		}
	}

	public void bajaCliente(ClienteDTO cDTO) {
		try {
			gestion.bajaCliente(cDTO);
		} catch (Exception e) {
			System.out.println("me fui por BD");
			e.printStackTrace();
		}
	}

	public ClienteDTO getCliente(Long cuil) {
		ClienteDTO cli = null;
		try {
			cli = gestion.getCliente(cuil);
		} catch (Exception e) {
			System.out.println("me fui por BD");
			e.printStackTrace();
		}
		return cli;
	}

	public List<ClienteDTO> getAllClientes(Long cuil) {
		List<ClienteDTO> lista = null;

		try {
			lista = gestion.getClientes();
		} catch (Exception e) {
			System.out.println("me fui por BD");
			e.printStackTrace();
		}

		return lista;
	}

	// LISTA PRECIO
	public void altaListaPrecio(ListaPrecioDTO cDTO) {
		try {
			gestion.crearListaPrecio(cDTO);
		} catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();

		}
	}

	public ListaPrecioDTO getListaPrecio(long id) {
		try {
			return gestion.getListaPrecio(id);
		} catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();
		}
		return null;
	}

	public void modificarListaPrecio(ProveedorDTO cDTO) {
		try {
			gestion.actualizarListaPrecio(cDTO);
		} catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();
		}
	}

	public ItemListaPrecioDTO getMejorPrecio(RodamientoDTO rod, int cant) {
		ItemListaPrecioDTO item = null;

		try {
			item = gestion.getMejorPrecio(rod, cant);
		} catch (Exception e) {
			System.out.println("me fui por BD");
			e.printStackTrace();
		}

		return item;
	}

	// PROVEEDOR
	public void altaProveedor(ProveedorDTO pDTO) {
		try {
			gestion.altaProveedor(pDTO);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void modificarProveedor(ProveedorDTO pDTO) {
		try {
			gestion.modificarProveedor(pDTO);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void bajaProveedor(Long cuil) {
		try {
			gestion.bajaProveedor(cuil);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public ProveedorDTO getProveedor(Long cuil) {
		ProveedorDTO prov = null;
		try {
			prov = gestion.getProveedor(cuil);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return prov;
	}

	// RODAMIENTO
	public boolean existeRodamiento(RodamientoDTO cDTO) {
		try {
			return gestion.existeRodamiento(cDTO);
		} catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();

		}
		return false;
	}

	public RodamientoDTO getRodamiento(RodamientoDTO cDTO) {
		try {
			return gestion.getRodamiento(cDTO);
		} catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();

		}
		return null;
	}
	public RodamientoDTO getRodamiento(long serie, String sufijo,
			String marca, String pais){
		try{
			return gestion.getRodamiento(serie, sufijo, marca, pais);
			
		}catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();

		}
		return null;
	}
	
	// SOLICITUD DE COTIZACION
	public void altaSolicitudDeCotizacion(SolicitudDeCotizacionDTO solDTO) {
		try {
			gestion.altaSolicitudDeCotizacion(solDTO);
		} catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();
		}
	}

	public SolicitudDeCotizacionDTO getSolicitudDeCotizacion(Long long1) {
		try {
			return gestion.getById(long1);
		} catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();
		}
		return null;
	}

	public void altaCotizacion(CotizacionDTO cotizacion) {
		try {
			gestion.saveCotizacion(cotizacion);
		} catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();
		}
	}
	
	public CotizacionDTO crearCotizacion(SolicitudDeCotizacionDTO sdto){
		try {
			return gestion.crearCotizacion(sdto);
			
		} catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();
			return null;
		}		
	}

	public CotizacionDTO getCotizacion(Long long1) {
		try {
			return gestion.getCotizacion(long1);
		} catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();
		}
		return null;
	}
	
	public int getNextItemScNumber() {
		try {
			return gestion.getNextItemSCNumber();
		} catch (RemoteException e) {
			e.printStackTrace();
		}
		return 0;
	}

	//
	public void comprarRodamientos() {
		try {
			gestion.comprarRodamientos();
		} catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();
		}

	}

	public void recibirMercaderia(Set<RemitoCPEDTO> lop) {
		try {
			gestion.recibirMercaderia(lop);
		} catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();
		}

	}

	public OrdenDeCompraDTO getOrdenCompra(int ordenCompraNumero) {
		try {
			return gestion.getOrdenCompra(ordenCompraNumero);
		} catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();
		}
		return null;
	}

	public void altaOC(OrdenDeCompraDTO oc) {
		try {
			gestion.altaOC(oc);
		} catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();
		}

	}

	public void altaOrdenDePedido(OrdenDePedidoDTO odp) {
		try {
			gestion.altaOrdenDePedido(odp);
		} catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();
		}
	}

	public void altaListaDeOrdenesDePedido(List<OrdenDePedidoDTO> odps) {
		try {
			for (OrdenDePedidoDTO odp : odps) {
				gestion.altaOrdenDePedido(odp);
			}
		} catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();
		}
	}

	public OrdenDePedidoDTO getOrdenDePedido(Long long1) {
		try {
			return gestion.getOrdenDePedido(long1);
		} catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();
		}
		return null;
	}

	public void altaRemito(RemitoDTO remitoDTO) {
		try {
			//remitoDTO.setFecha(null);
			gestion.altaRemito(remitoDTO);
		} catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();
		}
	}

	public List<RemitoDTO> getRemitosEmitidos(long cuilCliente) {
		try {
			return gestion.getRemitosEmitidos(cuilCliente);
		} catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();
		}
		return null;
	}

	// FACTURA
	public void altaFactura(FacturaDTO factura) {
		try {
			gestion.altaFactura(factura);
		} catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();
		}
	}

	public int getProximoNumeroFactura() {
		try {
			return gestion.getProximoNumeroFactura();
		} catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();
		}
		return 0;
	}
    
    public void altaRodamiento(RodamientoDTO rDTO) {
    	try{
    		gestion.saveRodamiento(rDTO);
    	}catch (Exception e){
    		System.out.println("me fui por el BD");
    		e.printStackTrace();
    	}
    }

	public ItemSolicitudDeCotizacionDTO getItemSolicitudDeCotizacion(Long long1) {
		try {
			 return gestion.getItemSolicitudDeCotizacion(long1);
		} catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();
		}
		return null;
	}
	public ItemCotizacionDTO getItemCotizacion(Long long1) {
		try {
			 return gestion.getItemCotizacion(long1);
		} catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();
		}
		return null;
	}
	
	public void cambiarEstadoItem(Long long1, EstadoItemPedido estadoNuevo){
		try{
			gestion.cambiarEstadoItem(long1, estadoNuevo);
		}catch (Exception e) {
			System.out.println("me fui por el BD");
			e.printStackTrace();
		}
	}
	
	public List<OrdenDePedidoDTO> getOrdenesPedidoByCliente(long cuil) {
		try {
			return gestion.getOrdenesPedidoByCliente(cuil);
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	
	public List<ItemPedidoDTO> getItemsPedidoByClienteEstado(long cuil, EstadoItemPedido estado){
		
			try {
				return gestion.getItemsPedidoEnviadosByCliente(cuil, estado);
			} catch (RemoteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return null;
	}
	
	public List<ItemPedidoDTO> getItemsPedidoByEstado(EstadoItemPedido estado) throws RemoteException{
		return gestion.getItemsPedidoByEstado(estado);
	}
	
	public void enviarMercaderia(Set<RemitoDTO> remitos){
		
		try {
			gestion.enviarMercaderia(remitos);
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	public Map<Long, ItemRemitoDTO> getMapItemPedidoItemRemito(List<ItemPedidoDTO> pedidos){
		try {
			return gestion.getMapItemPedidoItemRemito(pedidos);
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	
	public RemitoDTO getRemitoByNumero(int numero){
		try {
			return gestion.getRemitoByNumero(numero);
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	
}
